﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
using System.Xml.Linq;

namespace IBoLT.SettingWindows
{
	/// <summary>
	/// Логика взаимодействия для Cellular.xaml
	/// </summary>
	public partial class Cellular : Window
	{
		public IBoLT.Cellular.CellularTexture generator = new IBoLT.Cellular.CellularTexture();
		public TextureSettings STexture;

		private CommandBinding commBind;

		public Cellular(System.Drawing.Bitmap sourcePreview, TextureSettings STexture)
		{
			this.STexture = STexture;

			InitializeComponent();

			// Добавляю обработчик к событиям в коде, т.к. для его работы необходимо создание формы
			sliderLvlOriginal.ValueChanged += hCellularPreview;
			sliderLvlCreate.ValueChanged += hCellularPreview;
			sliderNumPoints.ValueChanged += hCellularPreview;
			sliderSeed.ValueChanged += hCellularPreview;

			// Привязка команд к обработчикам //
			commBind = new CommandBinding(CommandsIBoLT.cCellularGenerate, hCellularGenerateEx); this.CommandBindings.Add(commBind);
			commBind = new CommandBinding(CommandsIBoLT.cCellularChColor, hCellularChColorEx);

			generator.Texture = sourcePreview;
			wPreview.Width = sourcePreview.Width;
			wPreview.Height = sourcePreview.Height;

			ApplyPaletteToForm();

			hCellularPreview(null, null);
		}

		// Отображаю на форме настройку палитры для раскраски фрактала
		private void ApplyPaletteToForm()
		{
			// Размер кнопок для вывода цветов
			int buttonSize = 25;

			wPalette.Width = buttonSize;
			wPalette.Height = buttonSize * generator.palette.Length;

			for (int i = 0; i < generator.palette.Length; ++i)
			{
				Button b = new Button();
				b.Width = buttonSize;
				b.Height = buttonSize;
				System.Drawing.Color clr = System.Drawing.Color.FromArgb(generator.palette[i]);
				b.Background = new SolidColorBrush(Color.FromRgb(clr.R, clr.G, clr.B));
				b.TabIndex = i;
				wPalette.Children.Add(b);

				b.CommandBindings.Add(commBind);
				b.Command = CommandsIBoLT.cCellularChColor;
			}
		}

		private bool GetDataFromForm()
		{
			bool flag = false;

			if (generator.NumberOfPoint != (int)sliderNumPoints.Value)
			{
				generator.NumberOfPoint = (int)sliderNumPoints.Value;
				flag = true;
			}
			if (generator.Seed != (int)sliderSeed.Value)
			{
				generator.Seed = (int)sliderSeed.Value;
				flag = true;
			}

			return flag;
		}

		private bool Getlvl()
		{
			bool flag = false;

			if (generator.lvlOriginal != sliderLvlOriginal.Value)
			{
				generator.lvlOriginal = sliderLvlOriginal.Value;
				flag = true;
			}
			if (generator.lvlCreate != sliderLvlCreate.Value)
			{
				generator.lvlCreate = sliderLvlCreate.Value;
				flag = true;
			}
			return flag;
		}

		// Обработчик кнопок выбора цвета
		private void hCellularChColorEx(object sender, ExecutedRoutedEventArgs e)
		{
			System.Windows.Forms.ColorDialog colorDialog = new System.Windows.Forms.ColorDialog();
			Button btn = (Button)sender;

			if (colorDialog.ShowDialog() == System.Windows.Forms.DialogResult.OK)
			{
				System.Drawing.Color SDColor = colorDialog.Color;
				Color SWMColor = new Color();

				SWMColor.A = SDColor.A;
				SWMColor.R = SDColor.R;
				SWMColor.G = SDColor.G;
				SWMColor.B = SDColor.B;

				Brush brush = new SolidColorBrush(SWMColor);
				btn.Background = brush;
				generator.palette[btn.TabIndex] = colorDialog.Color.ToArgb();
			}

			wPreview.Source = SystemDrawingHelper.BitmapToBitmapImage(generator.ToBitmap());
		}

		// Обработчик изменения значений ползунков (предпросмотр)
		private void hCellularPreview(object sender, RoutedPropertyChangedEventArgs<double> e)
		{
			if (GetDataFromForm())
			{
				Getlvl();
				generator.CalculateDistance();
				wPreview.Source = SystemDrawingHelper.BitmapToBitmapImage(generator.ToBitmap());
			}
			else if (Getlvl())
			{
				wPreview.Source = SystemDrawingHelper.BitmapToBitmapImage(generator.ToBitmap());
			}
		}

		// Обработчик кнопки "Генерировать"
		private void hCellularGenerateEx(object sender, ExecutedRoutedEventArgs e)
		{
			STexture.Settings.Root.Add(new XElement("Генератор",
				new XAttribute("Название", "Cellular"),
				new XElement("Параметры",
					new XElement("Алгоритма",
						new XAttribute("Число_опорных_точек", generator.NumberOfPoint),
						new XAttribute("Seed", generator.Seed)),
					new XElement("Наложения",
						new XAttribute("Исходная_текстура", generator.lvlOriginal),
						new XAttribute("Генериремая_текстура", generator.lvlCreate)))));

			// Диалог успешен
			DialogResult = true;
		}
	}
}
